package com.wangjie.pattern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author jieshao
 * @date 2022/6/22 1:01
 *
 * JDK 动态代理(接口代理)
 *
 * 优点：代理对象的生成，是利用 JDK 的 API 在内存中动态创建的，这样可以减少代理类的创建和维护
 * 缺点：目标对象需要实现接口，否则不能使用 JDK 动态代理，同时还增加了代码的理解难度
 */
public class JdkProxy implements InvocationHandler {
    // 目标对象
    private Object target;

    public JdkProxy(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("权限校验");
        Object result = method.invoke(target, args);
        System.out.println("日志记录");
        return result;
    }
}